{Generate a barcode according to the UPC-A characterset    }{A string of custom digits (<10) is checked for size       }{for digit-only and then zero-primed                       }{the checksum is calculated and the UPC-digit is inserted  }{the 12-digit string is converted into plain barcode pixels}{the upc-pixels for start- middle- and endcode are inserted}{a pixelbuffer containing the complete barcode is returned }{if the function results 1 (no error)                      }{Copyrights: Ard Jonker, Amsterdam 1997.                   }{Remarks, questions and bugs to A.jonker@amc.uva.nl or a_team@dds.nl}function getdigit(s,this):integer;var tempstring:string;begin  {return the nth character from the left side, in s}   Delete(s,this+1,length(s)-this);   Delete(s,1,length(s)-1);   getdigit:=stringtonum(s);end;function checkcode(s):integer;     {calculate the checkdigit} var oddsum,evensum,i,thisdigit:integer;     {thisdigit:string;}begin  oddsum:=0;evensum:=0;  for i:=1 to length(s) do begin    {use stripped digits right to left}    thisdigit:=getdigit(s,length(s)-i+1);    if i mod 2 = 0 then      evensum:=evensum+thisdigit    else      oddsum:=oddsum+thisdigit;  end;  oddsum:=oddsum*3;  thisdigit:=(10-((oddsum+evensum) mod 10))mod 10;  checkcode:=thisdigit;end;procedure SelectBarcodeWinvar i,available:integer;begin  available:=0;  for i:=1 to npics do begin    selectPic(i);    if(windowtitle='Barcode') then available:=1;  end;  if not available then begin    SetNewSize(107,60);    MakeNewWindow('Barcode');    MoveWindow(200,200);  end;  SelectWindow('barcode');endprocedure clearbarsvar i:integer;begin  SelectBarcodeWin;  SelectAll;clear;  for i:=0 to (3+6*7+5+6*7+3) do    LineBuffer[i]:=0;  end;end;procedure startbarsbegin  LineBuffer[1]:=255;  LineBuffer[3]:=255;end;procedure middlebarsbegin  LineBuffer[47]:=255; LineBuffer[49]:=255;end;procedure endbarsbegin  LineBuffer[93]:=255; LineBuffer[95]:=255;end;procedure BarsToImage(extra)var available,i:integer;begin  For i:=0 to 50+extra do    PutRow(5,i,96);end;function lbitpat(n):string;begin  if n=0 then lbitpat:='0001101';  if n=1 then lbitpat:='0011001';  if n=2 then lbitpat:='0010011';  if n=3 then lbitpat:='0111101';  if n=4 then lbitpat:='0100011';  if n=5 then lbitpat:='0110001';  if n=6 then lbitpat:='0101111';  if n=7 then lbitpat:='0111011';  if n=8 then lbitpat:='0110111';  if n=9 then lbitpat:='0001011';end;function rbitpat(n):string;var i:integer;tempstr,outstr:string;begin tempstr:=lbitpat(n);outstr:=''; for i:=1 to 7 do    outstr:=concat(outstr,(1-getdigit(tempstr,i)):1); rbitpat:=outstr;end;procedure leftdigits(s);var thisdigit,i:integer;    coding:string;begin  for thisdigit:=1 to 6 do begin    coding:=lbitpat(getdigit(s,thisdigit));    for i:=1 to 7 do begin       if getdigit(coding,i) then begin          LineBuffer[3+i+7*(thisdigit-1)]:=255;       end;    end;  end;end;procedure rightdigits(s);var thisdigit,i:integer;    coding:string;begin  for thisdigit:=7 to 12 do begin    coding:=rbitpat(getdigit(s,thisdigit));    for i:=1 to 7 do begin       if getdigit(coding,i) then begin          LineBuffer[8+i+7*(thisdigit-1)]:=255;       end;    end;  end;end;procedure TextToImage(s)  var lstr,rstr:string;begin  SelectBarcodeWin;  lstr:=s;  Delete(lstr,7,6);  MoveTo(13,55);  Write(lstr);  rstr:=s;  Delete(rstr,1,6);  MoveTo(60,55);Write(rstr);end;function UPCA(s,UPCcode):integer;var zeroes:string;    result:integer;begin  if length(s)>10 then    result:=-1*(length(s))  else begin    zeroes:='0000000000';    Delete(zeroes,1,length(s));{perpare priming string of zeros}    s:=concat(UPCcode:1,zeroes,s);    s:=concat(s,checkcode(s):1);    {now s contains the entire UPC-A number of 12 digits, containing}    {1 UPC system digit,10 data digits and 1 checkdigit}    clearbars;startbars;middlebars;endbars;    BarsToImage(5);    leftdigits(s);rightdigits(s);    BarsToImage(0);    TextToImage(s);    result:=1;  end;  UPCA:=result;end;macro 'test/1';var mystring:string;    dummy,i,j,number:integer;begin  SetNewSize(350,350);  MakeNewWindow('wholebars');  for i:= 0 to 4 do begin    for j:=0 to 2 do begin      number:=199700000 + i*3 +j;      mystring:=concat(number:10);      ShowMessage('<',mystring,'>');      if not(UPCA(mystring,0)) then exit;      SelectBarcodeWindow;      SelectAll;copy;      SelectWindow('wholebars');      MakeRoi(j*110,i*70,107,60);Paste;KillROI;    end;  end;end;